package com.ruoyi.common.utils;

import com.ZMPrinter.*;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class PrintViaNet_Demo_UHF {
//    public static void main(String[] args) throws InterruptedException {
//
//        //region 定义打印机对象
//        zmprinter thiszmprinter = new zmprinter();//定义打印机对象
//        thiszmprinter.printerinterface= printerstyle.RFID_NET;//打印机接口类型
//        thiszmprinter.printerdpi = 300;//打印机分辨率，203dpi、300dpi或600dpi
//        thiszmprinter.printSpeed=4;//打印速度，赋值范围2~8，单位是英寸/秒
//        thiszmprinter.printDarkness=7;//打印黑度，赋值范围0~20，值越大打印头加热时间越长。一般使用蜡质碳带赋值7~12，树脂碳带赋值12~18
//        thiszmprinter.printernetip = "192.168.1.168";//打印机的ip地址，端口号可以不设置，默认是9100
//        //endregion
//
//        //region 定义标签对象
//        zmlabel thiszmlabel = new zmlabel();//定义标签对象
//        thiszmlabel.labelwidth = 73;//标签的宽度，单位是mm
//        thiszmlabel.labelheight = 20;//标签的高度，单位是mm
//        thiszmlabel.labelrowgap = 2;//标签之间的行间距，单位是mm
//        //endregion
//
//        //region 定义标签内需要打印的各个对象（一个标签上可以有多个对象，如文字、一维条码、二维条码、线条、矩形、图片、RFID写入数据等）
//        List<zmlabelobject> thiszmlabelobjectlist = new ArrayList<>();//定义标签上需要打印的对象列表
//
//        zmlabelobject thiszmlabelobject01 = new zmlabelobject();
//        thiszmlabelobject01.objectName = "truetype";//该对象是TrueType文字
//        thiszmlabelobject01.objectdata = "资产编号：XXXXXXXX";//文字内容
//        thiszmlabelobject01.Xposition = 5;//文字X坐标，单位mm
//        thiszmlabelobject01.Yposition = 4;//文字Y坐标，单位mm
//        thiszmlabelobject01.textfont = "黑体";//文字的字体
//        thiszmlabelobject01.fontstyle = 1;//粗体
//        thiszmlabelobject01.fontsize = 10;//文字的字号
//        thiszmlabelobjectlist.add(thiszmlabelobject01);//将文字对象添加进对象列表
//
////        zmlabelobject thiszmlabelobject02 = new zmlabelobject();
////        thiszmlabelobject02.objectName = "truetype";//该对象是TrueType文字
////        thiszmlabelobject02.objectdata = "资产名称：办公桌";//文字内容
////        thiszmlabelobject02.Xposition = 5;//文字X坐标，单位mm
////        thiszmlabelobject02.Yposition = 11;//文字Y坐标，单位mm
////        thiszmlabelobject02.textfont = "宋体";//文字的字体
////        thiszmlabelobject02.fontstyle = 1;//粗体
////        thiszmlabelobject02.fontsize = 10;//文字的大小
////        thiszmlabelobjectlist.add(thiszmlabelobject02);//将文字对象添加进对象列表
//
////        zmlabelobject thiszmlabelobject03 = new zmlabelobject();
////        thiszmlabelobject03.objectName = "truetype";//该对象是TrueType文字
////        thiszmlabelobject03.objectdata = "存放地点：信息部办公室";//文字内容
////        thiszmlabelobject03.Xposition = 5;//文字X坐标，单位mm
////        thiszmlabelobject03.Yposition = 18.5f;//文字Y坐标，单位mm
////        thiszmlabelobject03.textfont = "宋体";//文字的字体
////        thiszmlabelobject03.fontstyle = 1;//粗体
////        thiszmlabelobject03.fontsize = 10;//文字的大小
////        thiszmlabelobjectlist.add(thiszmlabelobject03);//将文字对象添加进对象列表
////
////        zmlabelobject thiszmlabelobject04 = new zmlabelobject();
////        thiszmlabelobject04.objectName = "truetype";//该对象是TrueType文字
////        thiszmlabelobject04.objectdata = "使用部门：信息部";//文字内容
////        thiszmlabelobject04.Xposition = 5;//文字X坐标，单位mm
////        thiszmlabelobject04.Yposition = 26;//文字Y坐标，单位mm
////        thiszmlabelobject04.textfont = "宋体";//文字的字体
////        thiszmlabelobject04.fontstyle = 1;//粗体
////        thiszmlabelobject04.fontsize = 10;//文字的大小
////        thiszmlabelobjectlist.add(thiszmlabelobject04);//将文字对象添加进对象列表
//
////        zmlabelobject thiszmlabelobject05 = new zmlabelobject();
////        thiszmlabelobject05.objectName = "barcode";//该对象是条码
////        thiszmlabelobject05.objectdata = "12345678";//条码内容
////        thiszmlabelobject05.Xposition = 50;//条码X坐标，单位mm
////        thiszmlabelobject05.Yposition = 0;//条码Y坐标，单位mm
////        thiszmlabelobject05.barcodekind = barcodestyle.QR_Code;//条码的类型
////        thiszmlabelobject05.barcodescale = 11;//条码的横向缩放系数，1~99，数字越大条码越宽
////        thiszmlabelobjectlist.add(thiszmlabelobject05);//将条码对象添加进对象列表
//
//        zmlabelobject thiszmlabelobject06 = new zmlabelobject();
//        thiszmlabelobject06.objectName = "rfiduhf";//该对象是RFID写入
//        thiszmlabelobject06.objectdata = "12345678";//RFID需要写入的内容
//        thiszmlabelobject06.RFIDDatablock = 0;//写入区域，0为EPC，1为USER
//        thiszmlabelobject06.RFIDDatatype = 1;//数据类型：0为文本，1为16进制
//        thiszmlabelobject06.RFIDerrortimes = 1;//错误重试次数
//        thiszmlabelobjectlist.add(thiszmlabelobject06);//将RFID对象添加进对象列表
//
//
//        zmlabelobject thiszmlabelobject07 = new zmlabelobject();
//        thiszmlabelobject07.objectName = "image";//该对象是图片
//        thiszmlabelobject07.Xposition = 53;//X坐标，单位mm
//        thiszmlabelobject07.Yposition = 4;//Y坐标，单位mm
//        //region 读取图片文件并转为byte[]
//        //读取图片文件
//        BufferedImage img =null;
//        try {
//            img = ImageIO.read(new File("C:\\Users\\wenle\\Pictures\\crmeb\\spread_1.jpeg"));//从文件中读取图片
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        if(img==null)
//            return;
//        //BufferedImage转byte[]
//        ByteArrayOutputStream out = new ByteArrayOutputStream();
//        try {
//            ImageIO.write(img, "png", out);
//            out.flush();
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                out.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//        //endregion
//        thiszmlabelobject07.imagedata = out.toByteArray();//添加图片的数据
//        thiszmlabelobject07.hscale=0.3f;//图片的横向缩放比例，值为1则不缩放
//        thiszmlabelobject07.vscale=0.3f;//图片的竖向缩放比例，值为1则不缩放
//        thiszmlabelobjectlist.add(thiszmlabelobject07);//将图片对象添加进对象列表
//
//        //endregion
//
//        //region 打印标签
//        long barcodesn = 210900030001L;//文字、条码及EPC的数据
//        printutility zmprintoperate = new printutility();//定义打印操作对象
//
//        for(int pnum=1;pnum<=1;pnum++) {
//            System.out.println("打印第"+pnum+"张");
//
//            //region 检查打印机状态
//            if(!zmprintoperate.CheckNetPrinterStatus(thiszmprinter))
//            {
//                System.out.println("打印机状态异常，请检查。");
//                return;
//            }
//            //endregion
//
//            //region 更改标签内指定文字、条码或RFID写入数据的内容
//            thiszmlabelobject01.objectdata="资产编号："+Long.toString(barcodesn);//更改thiszmlabelobject01对象的objectdata内容
////            thiszmlabelobject05.objectdata=Long.toString(barcodesn);//更改thiszmlabelobject05对象的objectdata内容
//            thiszmlabelobject06.objectdata=Long.toString(barcodesn);//更改thiszmlabelobject06对象的objectdata内容
//            //endregion
//
//            //region 根据标签上需要打印的对象列表生成打印数据
//            byte[] zmpclecommand = zmprintoperate.CreateLabelCommand(thiszmprinter, thiszmlabel, thiszmlabelobjectlist);//生成标签数据
//            if (zmpclecommand == null) {
//                System.out.println("生成标签数据异常为空.");
//                return;
//            }
//            //endregion
//
//            //region 发送打印数据给打印机
//            zmprintoperate.PrintLabelCommandbyNet(thiszmprinter, zmpclecommand);//发送数据给打印机
//            Thread.sleep(2000);//等待打印完成，根据打印速度和标签高度估算打印时间。如果网络打印，那么需要根据网络路由延迟加大等待时间
//            System.out.println(pnum+"张打印完成");
//            //endregion
//
//            barcodesn++;//序号加1
//        }
//        //endregion
//    }


    public static void main(String[] args) throws InterruptedException {
        List<List<zmlabelobject>> thiszmlabelobjectlist = new ArrayList<>();
        List<zmlabelobject> zmlabelobjects = new ArrayList<>();
        for (int pnum=1;pnum<=2;pnum++) {
             zmlabelobject thiszmlabelobject01 = new zmlabelobject();
            thiszmlabelobject01.objectName = "truetype";//该对象是TrueType文字
            thiszmlabelobject01.objectdata = "资产编号：rencai000000000000000000";//文字内容
            thiszmlabelobject01.Xposition = 5;//文字X坐标，单位mm
            thiszmlabelobject01.Yposition = 4;//文字Y坐标，单位mm
            thiszmlabelobject01.textfont = "黑体";//文字的字体
            thiszmlabelobject01.fontstyle = 1;//粗体
            thiszmlabelobject01.fontsize = 10;//文字的字号
            zmlabelobjects.add(thiszmlabelobject01);//将文字对象添加进对象列表

            zmlabelobject thiszmlabelobject02 = new zmlabelobject();
            thiszmlabelobject02.objectName = "truetype";//该对象是TrueType文字
            thiszmlabelobject02.objectdata = "资产名称：叉车";//文字内容
            thiszmlabelobject02.Xposition = 5;//文字X坐标，单位mm
            thiszmlabelobject02.Yposition = 11;//文字Y坐标，单位mm
            thiszmlabelobject02.textfont = "宋体";//文字的字体
            thiszmlabelobject02.fontstyle = 1;//粗体
            thiszmlabelobject02.fontsize = 10;//文字的大小
            zmlabelobjects.add(thiszmlabelobject02);//将文字对象添加进对象列表
            //        //region 定义标签内需要打印的各个对象（一个标签上可以有多个对象，如文字、一维条码、二维条码、线条、矩形、图片、RFID写入数据等）


            zmlabelobject thiszmlabelobject05 = new zmlabelobject();
            thiszmlabelobject05.objectName = "barcode";//该对象是条码
            thiszmlabelobject05.objectdata = "12345678";//条码内容
            thiszmlabelobject05.Xposition = 50;//条码X坐标，单位mm
            thiszmlabelobject05.Yposition = 0;//条码Y坐标，单位mm
            thiszmlabelobject05.barcodekind = barcodestyle.QR_Code;//条码的类型
            thiszmlabelobject05.barcodescale = 11;//条码的横向缩放系数，1~99，数字越大条码越宽
            zmlabelobjects.add(thiszmlabelobject05);//将条码对象添加进对象列表
            pnum++;
        }
        thiszmlabelobjectlist.add(zmlabelobjects);
        printVia(thiszmlabelobjectlist);
    }




public static void   printVia(List<List<zmlabelobject>> thiszmlabelobjectlist) throws InterruptedException {

        //region 定义打印机对象
        zmprinter thiszmprinter = new zmprinter();//定义打印机对象
        thiszmprinter.printerinterface= printerstyle.RFID_NET;//打印机接口类型
        thiszmprinter.printerdpi = 300;//打印机分辨率，203dpi、300dpi或600dpi
        thiszmprinter.printSpeed=4;//打印速度，赋值范围2~8，单位是英寸/秒
        thiszmprinter.printDarkness=7;//打印黑度，赋值范围0~20，值越大打印头加热时间越长。一般使用蜡质碳带赋值7~12，树脂碳带赋值12~18
        thiszmprinter.printernetip = "192.168.1.168";//打印机的ip地址，端口号可以不设置，默认是9100
        //endregion
        int charencoding=0;//QR码的字符编码,0为UTF-8，1为GB2312
        //region 定义标签对象
        zmlabel thiszmlabel = new zmlabel();//定义标签对象
        thiszmlabel.labelwidth = 73;//标签的宽度，单位是mm
        thiszmlabel.labelheight = 20;//标签的高度，单位是mm
        thiszmlabel.labelrowgap = 2;//标签之间的行间距，单位是mm
        //endregion

//        //region 定义标签内需要打印的各个对象（一个标签上可以有多个对象，如文字、一维条码、二维条码、线条、矩形、图片、RFID写入数据等）
//        List<zmlabelobject> thiszmlabelobjectlist = new ArrayList<>();//定义标签上需要打印的对象列表
//
//        zmlabelobject thiszmlabelobject01 = new zmlabelobject();
//        thiszmlabelobject01.objectName = "truetype";//该对象是TrueType文字
//        thiszmlabelobject01.objectdata = "资产编号：XXXXXXXX";//文字内容
//        thiszmlabelobject01.Xposition = 5;//文字X坐标，单位mm
//        thiszmlabelobject01.Yposition = 4;//文字Y坐标，单位mm
//        thiszmlabelobject01.textfont = "黑体";//文字的字体
//        thiszmlabelobject01.fontstyle = 1;//粗体
//        thiszmlabelobject01.fontsize = 10;//文字的字号
//        thiszmlabelobjectlist.add(thiszmlabelobject01);//将文字对象添加进对象列表
        printutility zmprintoperate = new printutility();//定义打印操作对象
        //region 检查打印机状态
        for (List<zmlabelobject> zmlabelobjects:thiszmlabelobjectlist) {
            if(!zmprintoperate.CheckNetPrinterStatus(thiszmprinter))
            {
                System.out.println("打印机状态异常，请检查。");
                return;
            }


            //region 根据标签上需要打印的对象列表生成打印数据
            byte[] zmpclecommand = zmprintoperate.CreateLabelCommand(thiszmprinter, thiszmlabel, zmlabelobjects);//生成标签数据
            if (zmpclecommand == null) {
                System.out.println("生成标签数据异常为空.");
                return;
            }
            //endregion

            //region 发送打印数据给打印机
            zmprintoperate.PrintLabelCommandbyNet(thiszmprinter, zmpclecommand);//发送数据给打印机
            Thread.sleep(2000);//等待打印完成，根据打印速度和标签高度估算打印时间。如果网络打印，那么需要根据网络路由延迟加大等待时间
        }


    }
}
